package com.course.dao;

import java.io.Serializable;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;

import com.course.hibernate.HibernateSessionFactory;

public class SupperDao
{
	// Ses@Entity
protected Session session = null;

	/**
	 * 保存信息
	 * 
	 * @param obj
	 *            对象
	 */
	public Boolean save( Object obj )
	{
		try
		{
			session = HibernateSessionFactory.getSession();
			session.beginTransaction(); // 开启事物
			session.save( obj ); // 保存对象
			session.getTransaction().commit(); // 提交事物
			session.close();
		} catch ( Exception e )
		{
			e.printStackTrace(); // 打印异常信息
			session.getTransaction().rollback(); // 回滚事物
			session.close();
			return false;
		}
		return true;
	}

	/**
	 * 保存/更新信息
	 * 
	 * @param obj
	 *            对象
	 */
	public Boolean saveOrUpdate( Object obj )
	{
		try
		{
			session = HibernateSessionFactory.getSession(); // 获取Session对象
			session.beginTransaction(); // 开启事物
			session.saveOrUpdate( obj ); // 保存或修改对象
			session.getTransaction().commit(); // 提交事物
			session.close();
		} catch ( Exception e )
		{
			e.printStackTrace(); // 打印异常信息
			session.getTransaction().rollback(); // 回滚事物
			session.close();
			return false;
		}
		return true;
	}

	/**
	 * 更新信息
	 * 
	 * @param obj
	 *            对象
	 */
	public Boolean update( Object obj )
	{
		try
		{
			session = HibernateSessionFactory.getSession(); // 获取Session对象
			session.beginTransaction(); // 开启事物
			session.update( obj ); // 修改对象
			session.getTransaction().commit(); // 提交事物
			session.close();
		} catch ( Exception e )
		{
			e.printStackTrace(); // 打印异常信息
			session.getTransaction().rollback(); // 回滚事物
			session.close();
			return false;
		}
		return true;
	}

	/**
	 * 删除信息
	 * 
	 * @param obj
	 *            对象
	 */
	public Boolean delete( Object obj )
	{
		try
		{
			session = HibernateSessionFactory.getSession(); // 获取Session对象
			session.beginTransaction(); // 开启事物
			session.delete( obj ); // 删除对象
			session.getTransaction().commit(); // 提交事物
			session.close();
		} catch ( Exception e )
		{
			e.printStackTrace(); // 打印异常信息
			session.getTransaction().rollback(); // 回滚事物
			session.close();
			return false;
		}
		return true;
	}

	@SuppressWarnings( "unchecked" )
	public Object get( Class arg0, Serializable arg1 )
	{
		Object obj = null;
		try
		{
			session = HibernateSessionFactory.getSession(); // 获取Session对象
			session.beginTransaction(); // 开启事物
			obj = session.get( arg0, arg1 ); // 查询对象
			session.getTransaction().commit(); // 提交事物
			
		} catch ( Exception e )
		{
			e.printStackTrace(); // 打印异常信息
			session.getTransaction().rollback(); // 回滚事物
			
		} finally
		{
			session.close();
		}
		return obj;
	}

	/**
	 * 按hql查询所有信息
	 * 
	 * @param hql
	 *            hql语句
	 */
	@SuppressWarnings( "unchecked" )
	public List findByHQL( String hql )
	{
		List list = null;
		try
		{
			session = HibernateSessionFactory.getSession(); // 获取Session对象
			session.beginTransaction(); // 开启事物
			list = session.createQuery( hql ) // 创建Query对象
					.list(); // 返回结果集
			session.getTransaction().commit(); // 提交事物
			
		} catch ( Exception e )
		{
			e.printStackTrace(); // 打印异常信息
			session.getTransaction().rollback(); // 回滚事物
			
		} finally
		{
			session.close();
		}
		return list;
	}

	/**
	 * 按hql删除信息
	 * 
	 * @param hql
	 *            hql语句
	 */
	public Boolean deleteByHQL( String hql )
	{
		try
		{
			session = HibernateSessionFactory.getSession(); // 获取Session对象
			session.beginTransaction(); // 开启事物
			session.createQuery( hql ) // 创建Query对象
					.executeUpdate(); // 更新
			session.getTransaction().commit(); // 提交事物
			session.close();
		} catch ( Exception e )
		{
			e.printStackTrace(); // 打印异常信息
			session.getTransaction().rollback(); // 回滚事物
			session.close();
			return false;
		}
		return true;
	}

	/**
	 * 单值检索
	 * 
	 * @param hql
	 *            hql语句
	 * @param where
	 *            查询条件数组
	 * @return Object
	 */
	public Object uniqueResult( String hql, Object[] where )
	{
		Object obj = null;
		try
		{
			session = HibernateSessionFactory.getSession(); // 获取Session对象
			session.beginTransaction(); // 开启事物
			Query query = session.createQuery( hql ); // 创建Query对象
			// 如果where不为空，则对HQL语句进行动态赋值
			if ( where != null && where.length > 0 )
			{
				for ( int i = 0; i < where.length; i++ )
				{
					if ( where[ i ] != null )
					{
						query = query.setParameter( i, where[ i ] );
					}
				}
			}
			obj = query.uniqueResult(); // 单值检索
			session.getTransaction().commit(); // 提交事物
			
		} catch ( Exception e )
		{
			e.printStackTrace(); // 打印异常信息
			session.getTransaction().rollback(); // 回滚事物
			
		} finally
		{
			session.close();
		}
		return obj;
	}
	
	/**
	 * 更新
	 * 
	 * @param hql
	 *            hql语句
	 * @param where
	 *            查询条件数组
	 * @return Object
	 */
	public int executeUpdate( String hql, Object[] where )
	{
		int temp = 0;
		try
		{
			session = HibernateSessionFactory.getSession(); // 获取Session对象
			session.beginTransaction(); // 开启事物
			Query query = session.createQuery( hql ); // 创建Query对象
			// 如果where不为空，则对HQL语句进行动态赋值
			if ( where != null && where.length > 0 )
			{
				for ( int i = 0; i < where.length; i++ )
				{
					if ( where[ i ] != null )
					{
						query = query.setParameter( i, where[ i ] );
					}
				}
			}
			temp = query.executeUpdate(); // 单值检索
			session.getTransaction().commit(); // 提交事物
			
		} catch ( Exception e )
		{
			e.printStackTrace(); // 打印异常信息
			session.getTransaction().rollback(); // 回滚事物
			
		} finally
		{
			session.close();
		}
		return temp;
	}

	/**
	 * 分页查询
	 * 
	 * @param hql
	 *            hql语句
	 * @param offset
	 *            起始位置
	 * @param length
	 *            偏移量
	 * @param where
	 *            查询条件,Object数组类型
	 * @return List集合
	 */
	@SuppressWarnings( "unchecked" )
	public List findPaging( String hql, int offset, int length, Object[] where )
	{
		List list = null;
		try
		{
			session = HibernateSessionFactory.getSession(); // 获取Session对象
			session.beginTransaction(); // 开启事物
			Query query = session.createQuery( hql ); // 创建Query对象
			// 构建查询条件
			if ( where != null && where.length > 0 )
			{
				for ( int i = 0; i < where.length; i++ )
				{
					if ( where[ i ] != null )
					{
						query = query.setParameter( i, where[ i ] );
					}
				}
			}
			list = query.setFirstResult( offset ) // 设置起始位置
					.setMaxResults( length ) // 偏移量
					.list(); // 获取结果集
			session.getTransaction().commit(); // 提交事物
			
		} catch ( Exception e )
		{
			e.printStackTrace(); // 打印异常信息
			session.getTransaction().rollback(); // 回滚事物
			
		} finally
		{
			session.close();
		}
		return list;
	}

}
